package com.ouc.eddyAlgorithm.service;


import com.ouc.eddyAlgorithm.entity.EddyCenterData;
import com.ouc.visualization.entity.NcTerrain;
import org.springframework.lang.Nullable;
import ucar.ma2.InvalidRangeException;
import ucar.nc2.NetcdfFile;

import java.io.IOException;

/**
 * 涡旋中心点三维结构数据
 */
public interface EddyAlgorithmCenterService {

  /**
   * 获取涡旋中心点三维结构的数据（默认获取全部层级数据）
   * TODO 由于 hycom 数据经纬度分辨率不一致，所以这里纬度稀释，经度不稀释。代码不具有通用性，后来者需要改进
   *
   * @param filename     文件名
   * @param variableName 变量名
   * @param lon          经度限制条件
   * @param lat          纬度限制条件
   * @return
   * @throws IOException
   */
  EddyCenterData getEddyCenterData(String filename, String variableName, Float[] lon, Float[] lat) throws IOException, InvalidRangeException;

  /**
   * 获取涡旋中心点三维结构的数据
   * TODO 由于 hycom 数据经纬度分辨率不一致，所以这里纬度稀释，经度不稀释。代码不具有通用性，后来者需要改进
   *
   * @param filename     文件名
   * @param variableName 变量名
   * @param lon          经度限制条件
   * @param lat          纬度限制条件
   * @param level        深度限制条件。若为null，则获取全部层级数据
   * @return
   * @throws IOException
   */
  EddyCenterData getEddyCenterData(String filename, String variableName, Float[] lon, Float[] lat, @Nullable Integer[] level) throws IOException, InvalidRangeException;

  /**
   * 获取涡旋中心点三维结构的数据
   * 未经过稀释处理
   *
   * @param ncFile       nc文件
   * @param variableName 变量名
   * @param lon          经度限制条件
   * @param lat          纬度限制条件
   * @param level        层级限制条件
   * @return
   * @throws IOException
   * @throws InvalidRangeException
   */
  EddyCenterData getEddyCenterDataByLimit(NetcdfFile ncFile, String variableName, Float[] lon, Float[] lat, @Nullable Integer[] level) throws IOException, InvalidRangeException;

  /**
   * 获取nc的等值面数据，将前台传输的范围数据，对nc三维数据进行筛选，找到第一个符合这个范围的深度数据，组合成二维数组
   *
   * @param ncFile        nc文件
   * @param variableName  变量名
   * @param lon           经度范围
   * @param lat           纬度范围
   * @param standardValue 设置的标准值，范围是standardValue-interval，standardValue+interval
   * @param interval      间隔
   * @return nc等值面数据
   */
  NcTerrain getNcIsosurfaces(NetcdfFile ncFile, String variableName, Float[] lon, Float[] lat, float standardValue, float interval) throws IOException, InvalidRangeException;


}
